package com.se.utils;

import java.util.*;
import java.math.BigDecimal;
import java.net.InetAddress;
import java.text.*;
import java.util.UUID; 

import javax.servlet.http.HttpServletRequest;


/**
 * @author SE Partners
 * 
 */
public class Tool {

	/**
	 * GMT를 기준으로 9시간 후를 off set으로 설정
	 */
	final static int rawOffset = 9 * 60 * 60 * 1000;
	final static Locale currentLocale = Locale.KOREA;
	final static NumberFormat numberFormatter = NumberFormat.getNumberInstance(currentLocale);

	/**
	 * 1일의 밀리세컨드.
	 */
	final static long DAY_SECOND = 1000 * 60 * 60 * 24;

	/**
	 * 텍스트 데이트를 Calendar 객체로 변환한다.
	 * 
	 * @param dateStr
	 * @param format
	 *            ('yyyyMMdd')
	 * @return Calendar
	 * @exception java.text.ParseException
	 */
	public static Calendar toCalendar(String dateStr, String format)
			throws java.text.ParseException {
		Date date = toDate(dateStr, format);
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		return cal;
	}

	/**
	 * 텍스트 데이트를 Date 객체로 변환한다.
	 * 
	 * @param dateStr
	 *            데이트 스트링
	 * @param format
	 *            포맷 예 - 'yyyyMMdd'
	 * @return Date
	 * @exception java.text.ParseException
	 */
	public static Date toDate(String dateStr, String format)
			throws java.text.ParseException {

		SimpleDateFormat sdf = new SimpleDateFormat(format, Locale.KOREA);
		Date date = sdf.parse(dateStr);
		return date;
	}

	/**
	 * 일 수를 구한다.
	 * 
	 * @param From
	 *            일. 형식은 'YYYYMMDD'이다.
	 * @param To
	 *            일. 형식은 'YYYYMMDD'이다.
	 * @return 일 수.
	 * @exception java.text.ParseException
	 */
	public static int getDays(String fromDt, String toDt)
			throws java.text.ParseException {

		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd", Locale.KOREA);

		Date d1 = sdf.parse(fromDt);
		Date d2 = sdf.parse(toDt);

		long from = d1.getTime();
		long to = d2.getTime();

		long times = to - from;

		int days = (int) (times / DAY_SECOND);

		return days;
	}

	/**
	 * format을 받아 알맞은 형태로 년월일시를 반환한다.
	 * 
	 * @param format
	 * @param field
	 * @param offset
	 * @return String 데이트 포맷에 따른 년월일시
	 */
	public static String getFormatDate(String format, int field, int offset) {

		SimpleTimeZone stz = new SimpleTimeZone(rawOffset, "KST");
		Calendar rightNow = Calendar.getInstance(stz);

		if (offset != 0) {
			rightNow.add(field, offset);
		}

		Date rightDate = rightNow.getTime();
		SimpleDateFormat sdf = new SimpleDateFormat(format);
		sdf.setTimeZone(stz);

		return sdf.format(rightDate);
	}

	/**
	 * 현재일에서 offset 만큼 더하거나 뺀 년월일을 yyyyMMdd 포맷으로 리턴한다
	 * 
	 * @param offset
	 * @return String yyyyMMdd 포맷의 년월일
	 */
	public static String getDate2(int offset) {
		return getFormatDate("yyyyMMdd", Calendar.DATE, offset);
	}

	public static String getMonth2(int offset) {
		return getFormatDate("yyyyMMdd", Calendar.MONTH, offset);
	}

	public static String getYear2(int offset) {
		return getFormatDate("yyyyMMdd", Calendar.YEAR, offset);
	}

	/**
	 * 현재 년월일을 yyyyMMdd 포맷으로 리턴한다
	 * 
	 * @return String yyyyMMdd 포맷의 년월일
	 */
	public static String getDate() {
		return getFormatDate("yyyyMMdd", 0, 0);
	}

	/**
	 * 현재 년월일을 yyyy/MM/dd 포맷으로 리턴한다
	 * 
	 * @return String yyyy/MM/dd 포맷의 년월일
	 */
	public static String getDate2() {
		return getFormatDate("yyyy/MM/dd", 0, 0);
	}

	/**
	 * 현재 년월일을 yyyy/MM/dd HH:mm 포맷으로 리턴한다
	 * 
	 * @return String yyyy/MM/dd HH:mm 포맷의 년월일
	 */
	public static String getDate3() {
		return getFormatDate("yyyy/MM/dd HH:mm", 0, 0);
	}

	/**
	 * 현재 년월일을 yyyy년 MM월 dd일 포맷으로 리턴한다
	 * 
	 * @return String yyyy/MM/dd 포맷의 년월일
	 */
	public static String getDate4() {
		return getFormatDate("yyyy년MM월dd일", 0, 0);
	}

	/**
	 * 현재 년을 yyyy 포맷으로 리턴한다
	 * 
	 * @return String yyyy 포맷의 년
	 */
	public static String getYear() {
		return getFormatDate("yyyy", 0, 0);
	}

	/**
	 * 현재 년월을 yyyyMM 포맷으로 리턴한다
	 * 
	 * @return String yyyy\MM 포맷의 년월
	 */
	public static String getYyyyMm() {
		return getFormatDate("yyyyMM", 0, 0);
	}

	/**
	 * 현재 시각을 HH:mm 포맷으로 리턴한다
	 * 
	 * @return String HH:mm 포맷의 시각
	 */
	public static String getTime() {
		return getFormatDate("HHmmss", 0, 0);
	}

	/**
	 * 현재 시각을 HHmm 타입으로 리턴한다.
	 * 
	 * @return String HHmm 포멧
	 */
	public static String getHHmm() {
		return getFormatDate("HHmm", 0, 0);
	}

	/**
	 * 현재 시각을 HHMM 타입으로 리턴한다.
	 * 
	 * @return String HHMM 포멧
	 */
	public static String getHH24() {
		return getFormatDate("HHMM", 0, 0);
	}

	public static String getDate5() {
		return getFormatDate("yyyy-MM-dd", 0, 0);
	}

	public static String getTime2() {
		return getFormatDate("HH:MM:SS", 0, 0);
	}

	/**
	 * 오늘 날짜 반환(yyyy-MM-dd HH:mm:ss)
	 * 
	 * @return String 오늘날짜시간(yyyy-MM-dd HH;mm:ss)
	 */
	public static String getYyyyMMddHHmmss() {
		Calendar cal = Calendar.getInstance();
		Date today = cal.getTime();
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String calen = format.format(today);

		return calen;
	}

	/**
	 * 오늘 날짜 반환(yyyyMMddHHmmss)
	 * 
	 * @return String 오늘날짜시간(yyyyMMddHHmmss)
	 */
	public static String getYyyyMMddHHmmss2() {
		Calendar cal = Calendar.getInstance();
		Date today = cal.getTime();
		SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
		String calen = format.format(today);

		return calen;
	}

	/**
	 * @param fromDt
	 * @param field
	 * @param offset
	 * @return
	 * @throws java.text.ParseException
	 */
	public static String addHours(String fromDt, int field, int offset)
			throws java.text.ParseException {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss",
				Locale.KOREA);

		Date fromDate = sdf.parse(fromDt);
		Calendar cal = Calendar.getInstance();
		cal.setTime(fromDate);
		cal.add(field, offset);

		Date toDate = cal.getTime();

		return sdf.format(toDate);
	}

	/**
	 * @param fromDt
	 * @param field
	 * @param offset
	 * @return
	 * @throws java.text.ParseException
	 */
	public static String addMinutes(String fromDt, int field, int offset)
			throws java.text.ParseException {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss",
				Locale.KOREA);

		Date fromDate = sdf.parse(fromDt);
		Calendar cal = Calendar.getInstance();
		cal.setTime(fromDate);
		cal.add(field, offset);

		Date toDate = cal.getTime();

		return sdf.format(toDate);
	}
	
	/**
	 * 
	 * @param fromDt
	 * @param field
	 * @param offset
	 * @return
	 * @throws java.text.ParseException
	 */
	public static String addSecond(String fromDt, int field, int offset)
	throws java.text.ParseException {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss",
				Locale.KOREA);
		
		Date fromDate = sdf.parse(fromDt);
		Calendar cal = Calendar.getInstance();
		cal.setTime(fromDate);
		cal.add(field, offset);
		
		Date toDate = cal.getTime();
		
		return sdf.format(toDate);
		}

	/**
	 * from date 부터 offset 만큼 더한 시간을 리턴한다.
	 * 
	 * @param from
	 *            date. 'HH' 형식이다.
	 * @param offset.
	 * @return to date. 'YYYYMMDD' 형식이다.
	 * @exception java.text.ParseException
	 */
	public static String addHours(String fromTime, int offset)
			throws java.text.ParseException {

		return addHours(fromTime, Calendar.HOUR, offset);
	}

	/**
	 * from date에서 field 의 offset 만큼 떨어진 to date를 리턴한다.
	 * 
	 * @param from
	 *            date. 'YYYYMMDD' 형식이다.
	 * @param field.
	 * @param offset.
	 * @return to date. 'YYYYMMDD' 형식이다.
	 * @exception java.text.ParseException
	 */
	public static String addMonths(String fromDt, int field, int offset)
			throws java.text.ParseException {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd", Locale.KOREA);
		Date fromDate = sdf.parse(fromDt);
		Calendar cal = Calendar.getInstance();
		cal.setTime(fromDate);
		cal.add(field, offset);

		Date toDate = cal.getTime();

		return sdf.format(toDate);
	}

	/**
	 * from date 부터 offset 만큼 더한 분을 리턴한다.
	 * 
	 * @param gubun
	 * @param fromTime
	 * @param offset
	 * @return
	 * @throws java.text.ParseException
	 */
	public static String addMinutes(String fromTime, int offset)
			throws java.text.ParseException {

		return addMinutes(fromTime, Calendar.MINUTE, offset);
	}
	
	
	public static String addSeconds(String fromTime, int offset)
	throws java.text.ParseException {

		return addSecond(fromTime, Calendar.SECOND, offset);
	}

	/**
	 * from date 부터 offset개월수 만큼 더한 월을 리턴한다.
	 * 
	 * @param from
	 *            date. 'YYYYMMDD' 형식이다.
	 * @param offset.
	 * @return to date. 'YYYYMMDD' 형식이다.
	 * @exception java.text.ParseException
	 */
	public static String addMonths(String fromDt, int offset)
			throws java.text.ParseException {
		return addMonths(fromDt, Calendar.MONTH, offset);
	}

	/**
	 * yyyyMMddHHmmss를 yyyyMMdd 형태로 반환.
	 * 
	 * @param String
	 *            yyyyMMddHHmmss
	 * @return String yyyyMMdd
	 */
	public static String getYyyyMMdd(String yyyyMMddHHmmss) {

		String ymd = yyyyMMddHHmmss.substring(0, 8);

		return ymd;

	}

	/**
	 * yyyyMMddHHmmss를 yyyy-MM-dd HH:mm:ss 로 반환함.
	 * 
	 * @param String
	 *            yyyyMMddHHmmss
	 * @return String yyyy-MM-dd HH:mm:ss
	 */
	public static String getYyyyMMddHHmmss(String yyyyMMddHHmmss) {

		if (!nvl(yyyyMMddHHmmss, "").equals("")
				&& yyyyMMddHHmmss.length() == 14) {

			String ymd = yyyyMMddHHmmss.substring(0, 4) + "-"
					+ yyyyMMddHHmmss.substring(4, 6) + "-"
					+ yyyyMMddHHmmss.substring(6, 8);
			String hms = yyyyMMddHHmmss.substring(8, 10) + ":"
					+ yyyyMMddHHmmss.substring(10, 12) + ":"
					+ yyyyMMddHHmmss.substring(12, 14);
			return ymd + " " + hms;
		} else if (!nvl(yyyyMMddHHmmss, "").equals("")
				&& yyyyMMddHHmmss.length() > 14) {
			return yyyyMMddHHmmss;
		} else {
			return getDate() + getTime();
		}
	}

	/**
	 * yyyyMMddHHmmss를 yyyy/MM/dd HH:mm:ss 로 반환함.
	 * 
	 * @param String
	 *            yyyyMMddHHmmss
	 * @return String yyyy/MM/dd HH:mm:ss
	 */
	public static String getYyyyMMddHHmmss2(String yyyyMMddHHmmss) {

		String ymd = yyyyMMddHHmmss.substring(0, 4) + "/"
				+ yyyyMMddHHmmss.substring(4, 6) + "/"
				+ yyyyMMddHHmmss.substring(6, 8);
		String hms = yyyyMMddHHmmss.substring(8, 10) + ":"
				+ yyyyMMddHHmmss.substring(10, 12) + ":"
				+ yyyyMMddHHmmss.substring(12, 14);
		return ymd + " " + hms;
	}

	/**
	 * HHmm의 HH를 반환한다.
	 * 
	 * @param String
	 *            HHmm
	 * @return String HH.
	 */
	public static String getHH(String HHmm) {
		String HH = HHmm.substring(0, 2);
		return HH;
	}
	
	public static String getTimeGap(String startDt, String endDt){
		
		//시간 설정
		SimpleDateFormat sf=new SimpleDateFormat("yyyyMMddhhmmss");
		Date startday	=sf.parse(startDt, new ParsePosition(0));
		Date endDate	=sf.parse(endDt, new ParsePosition(0));

		long startTime=startday.getTime();
		long endTime=endDate.getTime();
			
		long mills=endTime-startTime;
			
		//초로변환
		long second = mills/1000; 

		return Long.toString(second);
		
	}

	/**
	 * HHmm의 mm 반환한다.
	 * 
	 * @param String
	 *            HHmm
	 * @return String mm.
	 */
	public static String getMm(String HHmm) {
		return HHmm.substring(2, 4);
	}

	/**
	 * String type 의 데이터를 시간만 잘라서 가져오기
	 * 
	 * @param datetime
	 *            yyyyMMddHHmiSS 형식
	 * @return String
	 */
	public static String getTime(String datetime) {

		String strDate = null;

		if (datetime == null) {
			strDate = "";
		} else {
			if (datetime.length() >= 6) {
				strDate = datetime.substring(0, 2) + ":"
						+ datetime.substring(2, 4) + ":"
						+ datetime.substring(4, 6);
			}
		}

		return strDate;
	}

	/**
	 * 숫자에 3자리마다 comma를 붙인다.
	 * 
	 * @param String
	 * @return String
	 */
	public static String comma(String number) {

		if (number == null || number.equals("")) {
			return "0";
		}
		DecimalFormat numberFormatter = new DecimalFormat("###,##0.####");
		return numberFormatter.format(Integer.parseInt(number));
	}

	/**
	 * 숫자에 3자리마다 comma를 붙인다.
	 * 
	 * @param number
	 * @return String
	 */
	public static String comma(int number) {
		return numberFormatter.format(number);
	}

	/**
	 * 숫자에 3자리마다 comma를 붙인다.
	 * 
	 * @param number
	 * @return String
	 */
	public static String comma(long number) {
		return numberFormatter.format(number);
	}

	/**
	 * 숫자에 3자리마다 comma를 붙인다.
	 * 
	 * @param number
	 * @return String
	 */
	public static String comma(double number) {
		DecimalFormat doubleFormatter = new DecimalFormat("###,##0.####");
		return doubleFormatter.format(number);
	}

	/**
	 * 숫자에 3자리마다 comma를 붙인다.
	 * 
	 * @param number
	 * @return String
	 */
	public static String comma(Object number) {
		DecimalFormat doubleFormatter = new DecimalFormat("###,##0.####");
		return doubleFormatter.format(number);
	}

	/**
	 * 숫자에 3자리마다 comma를 붙인다. 소수 2자리까지 표현한다.
	 * 
	 * @param number
	 * @return String
	 */
	public static String comma2(double number) {
		DecimalFormat doubleFormatter = new DecimalFormat("###,##0.00");
		return doubleFormatter.format(number);
	}

	/**
	 * 숫자에 3자리마다 comma를 붙인다. 소수 3자리까지 표현한다.
	 * 
	 * @param number
	 * @return String
	 */
	public static String comma3(double number) {
		DecimalFormat doubleFormatter = new DecimalFormat("###,##0.000");
		return doubleFormatter.format(number);
	}

	/**
	 * 소수 3자리까지 표현한다.
	 * 
	 * @param number
	 * @return String
	 */
	public static String decomma(double number) {
		DecimalFormat doubleFormatter = new DecimalFormat("#####0.000");
		return doubleFormatter.format(number);
	}

	/**
	 * 숫자에 3자리마다 comma를 붙인다. 소수 4자리까지 표현한다.
	 * 
	 * @param number
	 * @return String
	 */
	public static String comma4(double number) {
		DecimalFormat doubleFormatter = new DecimalFormat("###,##0.0000");
		return doubleFormatter.format(number);
	}

	/**
	 * number를 좌측에서 0으로 채움.
	 * 
	 * @param number
	 * @return String
	 */
	public static String lpad(int number) {
		DecimalFormat intFormatter = new DecimalFormat("000");
		return intFormatter.format(number);
	}

	/**
	 * 오라클 LPAD 함수의 결과값 반환. (입력받은 문자열의 길이가 지정한 글자길이 보다 크거나 같으면 입력받은 문자열을 반환한다.
	 * 
	 * @param msg
	 *            입력받은 문자열.
	 * @param length
	 *            지정 글자수 입력.
	 * @param repStr
	 *            왼쪽에 덧붙일 문자.
	 * @return
	 */
	public static String lpad(String msg, int length, String repStr) {

		String ret = msg;
		// 입력받은 문자열의 길이가 지정한 글자길이 보다 크거나 같으면 입력받은 문자열을 반환한다.
		if (msg.length() >= length) {
			return ret;
		} else {
			for (int i = 0; i < length - msg.length(); i++) {
				ret = repStr + ret;
			}
			return ret;
		}
	}

	public static String nvl(Object obj) {
		if (obj == null)
			return "";
		else
			return (String) obj;
	}

	/**
	 * String이 null인 경우 리턴할 문자로 바꾸어 준다.
	 * 
	 * @param string
	 * @param null
	 *            인 경우 리턴할 문자
	 * @return String
	 */
	public static String nvl(String str, String str2) {
		if (str == null || str.equals("")) {
			return str2;
		}

		return str;
	}

	public static String nvl(String str) {
		if (str == null) {
			return "";
		}

		return str;
	}

	public static String checkTextArea(String str, String str2) {
		StringBuffer tempStr = new StringBuffer("");
		char tempChar;
		if (str == null) {
			return str2;
		}
		for (int index = 0; index < str.length(); index++) {
			tempChar = str.charAt(index);
			if (tempChar == '\n')
				tempStr.append("<BR>");
			else
				tempStr.append(tempChar);
		}

		return tempStr.toString();
	}

	public static String checkTextArea(String str) {
		StringBuffer tempStr = new StringBuffer("");
		char tempChar;
		if (str == null) {
			return new String("&nbsp;");
		}
		for (int index = 0; index < str.length(); index++) {
			tempChar = str.charAt(index);
			if (tempChar == '\n')
				tempStr.append("<BR>");
			else
				tempStr.append(tempChar);
		}

		return tempStr.toString();
	}

	/**
	 * 여부(Y/N)에 대해 "예", "아니오"로 바꾸어 준다.
	 * 
	 * @param string
	 * @return String
	 */
	public static String convertYn(String str) {
		if (str == null) {
			return null;
		}

		if (str.equals("Y")) {
			return "예";
		}

		return "아니오";
	}

	/**
	 * 여부(Y/N)에 대해 str1, str2로 바꾸어 준다.
	 * 
	 * @param string
	 * @return String
	 */
	public static String convertYn(String str, String str1, String str2) {
		if (str == null) {
			return null;
		}

		if (str.equals("Y") || str.equals("1")) {
			return str1;
		}

		return str2;
	}

	public static String trimDate(String date) {

		if (date == null) {
			return "";
		}

		date = date.trim();

		if (date.length() == 8) {
			return date;
		}

		return date.substring(0, 4) + date.substring(5, 7) + date.substring(8);
	}

	/**
	 * 
	 * @param date
	 * @param division
	 * @return String
	 */
	public static String convertDate(String date, String division) {

		if (date == null) {
			return "";
		}

		date = date.trim();

		if (date.length() != 8) {
			return date;
		}

		return date.substring(0, 4) + division + date.substring(4, 6)
				+ division + date.substring(6);
	}

	/**
	 * 
	 * @param date
	 * @param division
	 * @return
	 */
	public static String convertYearMonth(String date, String division) {

		if (date == null) {
			return "";
		}

		date = date.trim();

		if (date.length() != 6) {
			return date;
		}

		return date.substring(0, 4) + division + date.substring(4, 6);
	}

	/**
	 * 20101102 -- 2010/11/02
	 * 
	 * @param date
	 *            String
	 * @param division
	 *            String
	 * @return String
	 */
	public static String convertDate(String date) {
		return convertDate(date, "/");
	}

	/**
	 * 20101102 -- 2010-11-02
	 * 
	 * @param date
	 *            String
	 * @return String
	 */
	public static String convertDate2(String date) {
		return convertDate(date, "-");
	}

	/**
	 * 20101102130000 -- 2010/11/01 13:00:00
	 * 
	 * @param date
	 *            String
	 * @return String
	 */
	public static String convertDate3(String date) {

		if (date == null) {
			return "";
		}

		date = date.trim();

		if (date.length() != 14) {
			return date;
		}

		return date.substring(0, 4) + "/" + date.substring(4, 6) + "/"
				+ date.substring(6, 8) + " " + date.substring(8, 10) + ":"
				+ date.substring(10, 12) + ":" + date.substring(12, 14);
	}

	/**
	 * 20101102130000 -- 2010-11-02 13:00:00
	 * 
	 * @param date
	 *            String
	 * @return String
	 */
	public static String convertDate5(String date) {

		if (date == null) {
			return "";
		}

		date = date.trim();

		if (date.length() != 14) {
			return date;
		}

		return date.substring(0, 4) + "-" + date.substring(4, 6) + "-"
				+ date.substring(6, 8) + " " + date.substring(8, 10) + ":"
				+ date.substring(10, 12) + ":" + date.substring(12, 14);
	}

	/**
	 * 20101102130000 -- 2010/11/02
	 * 
	 * @param date
	 * @return
	 */
	public static String convertDate6(String date) {

		if (date == null) {
			return "";
		}

		date = date.trim();

		if (date.length() != 14) {
			return date;
		}

		return date.substring(0, 4) + "/" + date.substring(4, 6) + "/"
				+ date.substring(6, 8);
	}

	/**
	 * 201011021300 -- 2010/11/01 13:00
	 * 
	 * @param date
	 *            String
	 * @return String
	 */
	public static String convertDate7(String date) {

		if (date == null) {
			return "";
		}

		date = date.trim();

		if (date.length() != 12) {
			return date;
		}

		return date.substring(0, 4) + "/" + date.substring(4, 6) + "/"
				+ date.substring(6, 8) + " " + date.substring(8, 10) + ":"
				+ date.substring(10, 12);
	}
	
	
	public static String convertDate8(String date) {

		if (date == null) {
			return "";
		}

		date = date.trim();

		if (date.length() != 14) {
			return date;
		}

		return date.substring(0, 4) + "년 " + date.substring(4, 6) + "월 "
				+ date.substring(6, 8) + "일 " + date.substring(8, 10) + ":"
				+ date.substring(10, 12) + ":" + date.substring(10, 12);
	}
	
	/**
	 * 시스템 날짜에 해당하는 분기를 리턴.
	 * 
	 * 
	 * @return String
	 */
	public static String getQuarter() {
		String yyyyMm = getYyyyMm();
		String mm = yyyyMm.substring(4, 6);
		String quarter = new String();
		if (mm.equals("01") || mm.equals("02") || mm.equals("03")) {
			quarter = "1";
		} else if (mm.equals("04") || mm.equals("05") || mm.equals("06")) {
			quarter = "2";
		} else if (mm.equals("07") || mm.equals("08") || mm.equals("09")) {
			quarter = "3";
		} else if (mm.equals("10") || mm.equals("11") || mm.equals("12")) {
			quarter = "4";
		}
		return quarter;
	}

	/**
	 * 두자리 숫자에 해당하는 분기를 리턴
	 * 
	 * 
	 * @return String
	 */
	public static String getQuarter(String mm) {

		String quarter = null;
		if (mm.equals("01") || mm.equals("02") || mm.equals("03")) {
			quarter = "1";
		} else if (mm.equals("04") || mm.equals("05") || mm.equals("06")) {
			quarter = "2";
		} else if (mm.equals("07") || mm.equals("08") || mm.equals("09")) {
			quarter = "3";
		} else if (mm.equals("10") || mm.equals("11") || mm.equals("12")) {
			quarter = "4";
		}
		return quarter;
	}

	public static String getHyphen(String str, int locate) {

		if (str == null) {
			return "";
		}

		str = str.trim();

		if (str.length() < locate)
			return str;
		return str.substring(0, locate) + "-" + str.substring(locate);
	}

	public static String setMaxLength(String str, int maxLength) {
		if (str == null) {
			return "";
		}
		if (str.length() <= maxLength)
			return str;
		if (maxLength < 3)
			return str.substring(0, 2);

		StringBuffer returnString = new StringBuffer();
		str = str.trim();

		returnString.append(str.substring(0, maxLength - 1)).append("..");

		return returnString.toString();
	}

	// 콤마달린 숫자를 문자열로써 받아서 콤마가 제거된 문자열로 넘긴다
	public static String deComma(String NumberWithCommaAsString) {

		StringTokenizer st = new StringTokenizer(NumberWithCommaAsString, ",");
		StringBuffer temp = new StringBuffer();
		while (st.hasMoreTokens()) {
			temp.append(st.nextToken());

		}
		NumberWithCommaAsString = temp.toString();
		return NumberWithCommaAsString;
	}

	/**
	 * num길이만큼 format으로 채운 str return
	 * 
	 * @param str
	 * @param format
	 * @param num
	 * @return String
	 * 
	 */
	public static String getFormStr1(String str, String format, int num) {
		String temp = "";
		if (str == null)
			str = "";

		byte[] b = str.getBytes();

		int len = num - b.length;

		for (int i = 0; i < len; i++) {
			temp += format;
		}

		if (format == "0") {
			str = temp + str;
		} else {
			str = str + temp;
		}

		return str;
	}

	public static String getFormStr(String str, String format, int num) {
		String temp = "";

		if (str == null)
			str = "";

		int len = 0;
		for (int j = 0; j < str.length(); j++) {
			char c = str.charAt(j);
			if (c < 0xac00 || 0xd7a3 < c) {
				len++;
			} else {
				len += 2;
			}
		}

		len = num - len;

		for (int i = 0; i < len; i++) {
			temp += format;
		}

		if (format == "0") {
			str = temp + str;
		} else {
			str = str + temp;
		}

		return str;
	}

	/**
	 * num길이만큼 format으로 채운 str return
	 * 
	 * @param str
	 * @param format
	 * @param num
	 * @return String
	 * 
	 */
	public static String getFormStr(String str, int num) {
		return getFormStr(str, " ", num);
	}

	/**
	 * num길이만큼 " "으로 채운다.
	 * 
	 * @param num
	 * @return String 문자
	 * 
	 */
	public static String getFormStr(int num) {
		String temp = "";
		for (int i = 0; i < num; i++) {
			temp += " ";
		}

		return temp;
	}

	/**
	 * 반올림한다.
	 * 
	 * @param d
	 * @param p
	 * @return double
	 */
	public static double round(double d, int p) {
		long tmp = (long) Math.pow(10, p);
		double num = Math.round(d * tmp);
		num /= tmp;
		return num;
	}
	
	
	/**
	 * 절상한다.
	 * 
	 * @param d
	 * @param p
	 * @return double
	 */
	public static double ceil(double d, int p) {
		long tmp = (long) Math.pow(10, p);
		double num = Math.ceil(d * tmp);
		num /= tmp;
		return num;
	}

	/**
	 * 절사한다.
	 * 
	 * @param d
	 * @param p
	 * @return double
	 */
	public static double floor(double d, int p) {
		long tmp = (long) Math.pow(10, p);
		double num = Math.floor(d * tmp);
		num /= tmp;
		return num;
	}
	
	/**
	 * 문자열중의 특정스트링을 변환하는 함수
	 * 
	 * @param str
	 *            원래문자열
	 * @param token
	 *            바뀔문자열
	 * @param to
	 *            바꿀문자열
	 * @return String
	 */
	public static String replace(String str, String token, String to) {
		String resultStr = "";
		int idx = -1;
		if(str != null && str.length() > 0 && token != null && token.length() > 0) {
		    while ((idx = str.indexOf(token)) != -1) {
		        resultStr += str.substring(0, idx) + to;
		        str = str.substring(idx + token.length());
		    }
		}
		resultStr += str;

		return resultStr;
	}

	/**
	 * 문자열에 특정문자가 포함되어 있는지 체크
	 * 
	 * @param str
	 * @param token
	 * @return
	 */
	public static boolean checkValue(String strings, String str) {
		boolean result = false;

		if (strings.indexOf(str) == -1) {
			result = true;
		}
		return result;
	}

	/**
	 * 문자에서 Hyphen을 없앤다.
	 * 
	 * @param str
	 * @return String
	 */
	public static String deleteHyphen(String str) {
		String temp = "";

		if (str == null || str.equals("")) {
			return str;
		}

		for (int i = 0; i < str.length(); i++) {
			if (str.charAt(i) == '-') {
				continue;
			} else {
				temp += str.charAt(i);
			}
		}

		return temp;
	}

	/**
	 * 문자에서 / 을 없앤다.
	 * 
	 * @param str
	 * @return String
	 */
	public static String deleteSulesi(String str) {
		String temp = "";

		if (str == null || str.equals("")) {
			return str;
		}

		for (int i = 0; i < str.length(); i++) {
			if (str.charAt(i) == '/') {
				continue;
			} else {
				temp += str.charAt(i);
			}
		}

		return temp;
	}

	/**
	 * num길이만큼 format으로 채운 str return
	 * 
	 * @param str
	 * @param format
	 * @param num
	 * @return String
	 * 
	 */
	public static String getFormStr2(String str, String format, int num) {
		String temp = "";
		if (str == null)
			str = "";

		byte[] b = str.getBytes();

		int len = num - b.length;

		for (int i = 0; i < len; i++) {
			temp += format;
		}

		if (format == "0") {
			str = temp + str;
		} else {
			str = str + temp;
		}

		return str;
	}

	public static String getHTMLCode(String text) {

		if (text == null || text.equals(""))
			return "";

		StringBuffer sb = new StringBuffer(text);
		char ch;

		for (int i = 0; i < sb.length(); i++) {
			ch = sb.charAt(i);
			if (ch == '<') {
				sb.replace(i, i + 1, "&lt;");
				i += 3;
			} else if (ch == '>') {
				sb.replace(i, i + 1, "&gt;");
				i += 3;
			} else if (ch == '&') {
				sb.replace(i, i + 1, "&amp;");
				i += 4;
			} else if (ch == '\'') {
				sb.replace(i, i + 1, "&#39;");
				i += 4;
			} else if (ch == '"') {
				sb.replace(i, i + 1, "&quot;");
				i += 5;
			} else if (ch == ' ') {
				sb.replace(i, i + 1, "&nbsp;");
				i += 5;
			} else if (ch == '\r' && sb.charAt(i + 1) == '\n') {
				sb.replace(i, i + 2, "<BR>");
				i += 3;
			} else if (ch == '\n') {
				sb.replace(i, i + 1, "<BR>");
				i += 3;
			}
		}
		return sb.toString();
	}

	/**
	 * html 코드로 바꿔주는 메소드
	 * 
	 * @param text
	 * @return str
	 */
	public static String getReplaceStr(String text) {

		if (text == null || text.equals(""))
			return "";
		for (int i = 0; i < text.length(); i++) {

		}
		String str = text.replaceAll("&lt;", "<").replaceAll("&gt;", ">")
					.replaceAll("&amp;", "&").replaceAll("&amp;", "&").replaceAll(
						"&#39;", "\'").replaceAll("&quot;", "\"").replaceAll(
						"&nbsp;", " ");

		return str;
	}
	
	public static String getFileExt(String s) {

		int i = s.lastIndexOf(".");
		if (i == -1)
			return null;
		if (i == s.length() - 1)
			return null;
		else
			return s.substring(i + 1);
	}

	public static String showHtml(String s) {

		if (s == null)
			return "";
		else
			return rplc(rplc(s, "<", "&lt;"), "\n", "<br>");
	}

	public static String rplc(String s, String s1, String s2) {

		if (s == null)
			return null;
		if (s1 == null || s1.length() == 0 || s2 == null)
			return s;
		int i = s.lastIndexOf(s1);
		if (i < 0)
			return s;
		StringBuffer stringbuffer = new StringBuffer(s);
		for (; i >= 0; i = s.lastIndexOf(s1, i - 1))
			stringbuffer.replace(i, i + s1.length(), s2);

		return stringbuffer.toString();
	}

	public static String removeTag(String s) {

		int i = s.indexOf("&lt;");
		if (i != -1) {
			int j = s.indexOf(">", i);
			if (j != -1) {
				s = s.substring(0, i) + s.substring(j + 1);
				s = removeTag(s);
			}
		}
		return s;
	}
	
	public static String removeHtmlTag(String s) {
		
		if(nvl(s,"").equals("")){ return ""; } 
		
		return s.replaceAll("<(/)?([a-zA-Z]*)(\\s[a-zA-Z]*=[^>]*)?(\\s)*(/)?>", "");
	}
	
	public static String mReplace(String s, String s1, String s2) {

		boolean flag = false;
		if (s == null)
			return "";
		String s3 = s;
		StringBuffer stringbuffer = new StringBuffer();
		stringbuffer.append("");
		int i;
		for (; s3.indexOf(s1) > -1; s3 = s3.substring(i + s1.length())) {
			i = s3.indexOf(s1);
			stringbuffer.append(s3.substring(0, i));
			stringbuffer.append(s2);
		}

		stringbuffer.append(s3);
		return stringbuffer.toString();
	}

	public static String toDateFormat(String s, int i) {

		if (s == null || s.length() < i)
			return "";
		if (i == 6) {
			String s1 = s.substring(0, 2);
			s1 = s1 + ":";
			s1 = s1 + s.substring(2, 4);
			s1 = s1 + ":";
			s1 = s1 + s.substring(4, 6);
			return s1;
		}
		String s2 = s.substring(0, 4);
		s2 = s2 + ".";
		s2 = s2 + s.substring(4, 6);
		if (i == 8) {
			s2 = s2 + ".";
			s2 = s2 + s.substring(6, 8);
		} else if (i == 14) {
			s2 = s2 + ".";
			s2 = s2 + s.substring(6, 8);
			s2 = s2 + " ";
			s2 = s2 + s.substring(8, 10);
			s2 = s2 + ":";
			s2 = s2 + s.substring(10, 12);
			s2 = s2 + ":";
			s2 = s2 + s.substring(12, 14);
		}
		return s2;
	}

	/**
	 * (@)param값이 숫자로만 이루어져 있는지 체크
	 * 
	 * @param num
	 * @return
	 */
	public static boolean isNumeric(String num) {
		boolean rtn = false;

		try {
			long tmp = Long.parseLong(num);
			rtn = true;
		} catch (Exception e) {
		}

		return rtn;
	}

	/**
	 * 
	 * long 타입의 숫자를 소숫점 한자리에서 올림하는 메소드
	 * 
	 * @param value
	 * @return
	 */
	public static float roundUp(float value) {

		BigDecimal temp = new BigDecimal(value);

		// 소숫점 첫재자리
		int tenthsValue = temp.movePointRight(1).intValue() % 10;

		if (tenthsValue > 0 && tenthsValue <= 5) {
			temp = temp.setScale(0, BigDecimal.ROUND_DOWN).add(
					new BigDecimal(0.5));
		} else if (tenthsValue > 5 && tenthsValue <= 9) {
			temp = temp.setScale(0, BigDecimal.ROUND_DOWN).add(
					new BigDecimal(1));
		} else {
			temp = temp.setScale(1, BigDecimal.ROUND_DOWN);
		}

		return temp.floatValue();
	}

	/**
	 * 
	 * 입력 받은 두수를 나누어 float 형태로 반환한다. 소숫점 첫째 자리까지만
	 * 
	 * @param valueA
	 * @param valueB
	 * @return
	 */
	public static float divide(long valueA, long valueB) {

		BigDecimal point = new BigDecimal(valueA);
		BigDecimal total = new BigDecimal(valueB);

		return point.divide(total, 2, BigDecimal.ROUND_DOWN).floatValue();
	}

	/**
	 * 
	 * str 문자열이 num 이하의 자릿수일경우 앞에 '0' 셋팅
	 * 
	 * @param str
	 * @param num
	 * @return
	 */
	public static String addZero(String str, int num) {

		String strRtn = "";

		if (nvl(str, "").equals("")) {
			return "";
		}

		if (str.length() < num) {
			for (int i = str.length(); i < num; i++) {
				strRtn += "0";
			}
			strRtn = strRtn + str;
		} else {
			strRtn = str;
		}

		return strRtn;
	}

	

	/**
	 * String을 읽어 숫자만 모아 return ('-', 포함)
	 * 
	 * @param s
	 * @return
	 */
	public static String alphaNumOnly(String str) {
		int i = str.length();
		StringBuffer stringbuffer = new StringBuffer(i);
		for (int j = 0; j < i; j++) {
			char c = str.charAt(j);
			if ((c >= '0' && c <= '9') || c == '-')
				stringbuffer.append(c);
		}

		return stringbuffer.toString();
	}

	// UTF-8은 최대 4바이트를 사용하고 ASCII는 1바이트 그외의 문자들은 2~3바이트 까지 조합하여 사용한다.
	// 즉, 어느 나라 문자이냐에 따라서 몇 바이트를 사용하는지 모르기 때문에 하나의 charater가 몇 바이트 대역에
	// 있는지 조사하여 한문자의 바이트를 조사... 이를 더해 나가면 문자 단위로 몇 바이트를 차지 하는지 정확하게 조사할 수 있다.
	public static int ONE_BYTE_MIN = 0x0000;

	public static int ONE_BYTE_MAX = 0x007F;

	public static int TWO_BYTE_MIN = 0x0800;

	public static int TWO_BYTE_MAX = 0x07FF;

	public static int THREE_BYTE_MIN = 0x0800;

	public static int THREE_BYTE_MAX = 0xFFFF;

	public static int SURROGATE_MIN = 0x10000;

	public static int SURROGATE_MAX = 0x10FFFF;
	
	public static String cutOffUTF8String(String str, int maxByteSize, String trail) {
		try {
			// 널일 경우에는 그냥 리턴
			if (str == null)
				return null;

			if (str.length() == 0)
				return str;

			byte strByte[] = str.getBytes("UTF-8");

			if (strByte.length <= maxByteSize)
				return str;

			/*
			 * //마지막 줄임말 int trailByteSize = 0;
			 * 
			 * //줄임말의 바이트 수 계산 if (trail != null) trailByteSize =
			 * trail.getBytes("UTF-8").length;
			 * 
			 * //실질적으로 포함되는 최대 바이트 수는 trailByte를 뺀 것이다. maxByteSize =
			 * maxByteSize - trailByteSize;
			 */

			// 마지막 바이트 위치
			int endPos = 0;
			// 현재까지 조사한 바이트 수
			int currByte = 0;

			for (int i = 0; i < str.length(); i++) {
				// 순차적으로 문자들을 가져옴.
				char ch = str.charAt(i);

				// 이 문자가 몇 바이트로 구성된 UTF-8 코드인지를 검사하여 currByte에 누적 시킨다.
				currByte = currByte + availibleByteNum(ch);

				// 현재까지 조사된 바이트가 maxSize를 넘는다면 이전 단계 까지 누적된 바이트 까지를 유효한 바이트로
				// 간주한다.
				if (currByte > maxByteSize) {
					endPos = currByte - availibleByteNum(ch);
					break;
				}
			}

			// 원래 문자열을 바이트로 가져와서 유효한 바이트 까지 배열 복사를 한다.

			byte newStrByte[] = new byte[endPos];

			System.arraycopy(strByte, 0, newStrByte, 0, endPos);

			String newStr = new String(newStrByte, "UTF-8");

			newStr += trail;

			return newStr;
		} catch (Exception e) {
			return "";
		}
	}
	
	
	public static int availibleByteNum(char c) {
		int digit = (int) c;

		if (ONE_BYTE_MIN <= digit && digit <= ONE_BYTE_MAX)
			return 1;
		else if (TWO_BYTE_MIN <= digit && digit <= TWO_BYTE_MAX)
			return 2;
		else if (THREE_BYTE_MIN <= digit && digit <= THREE_BYTE_MAX)
			return 3;
		else if (SURROGATE_MIN <= digit && digit <= SURROGATE_MAX)
			return 4;
		return -1;
	}
	
	/**
	 * 
	 * 현재 서버의 IP 주소를 반환한다.
	 * 
	 * @return
	 */
	public static String getIPAddress() {

		String hostAddress = "127.0.0.1";
		try {
			InetAddress inet = InetAddress.getLocalHost();
			hostAddress = inet.getHostAddress();
		} catch (Exception e) {
			e.printStackTrace();
		}

		return hostAddress;
	}

	/**
	 * 
	 * 원격 사용자의 IP를 구한다
	 * 
	 * @return
	 */
	public static String getRemoteIPAddress(HttpServletRequest request) {

		String hostAddress = "127.0.0.1";
		try {
			hostAddress = request.getHeader("X-Forwarded-For");
		} catch (Exception e) {
			e.printStackTrace();
		}

		return hostAddress;
	}
	
	public static String convertUseYn(String str){
		
		String strRtn = "미사용";
		
		if(str.equals("Y")){
			strRtn = "사용";
		}
		
		return strRtn;
	}
	
	public static String convertObjectType(String objType, String subType){
		
		String strRtn = "";
		
		/*
    	 *필터   			object_type=1 	subtype= 256
		 *사용자 정의그룹  object_type=1 	subtype= 257
		 *탬플릿     		object_type=2
	     *리포트   		object_type=3
		 *폴더  			object_type=8
		 *프롬프트  		object_type=10
		 *바로가기  		object_type=18
		 *다큐먼트  		object_type=55 	subtype= 14081
		 *HTML다큐먼트 	object_type=55 	subtype= 14080
    	 */
		
		if(objType.equals("1")){
			if(subType.equals("256")){
				strRtn = "필터";
			}else if(subType.equals("257")){
				strRtn = "사용자 정의그룹";
			}
		}else if(objType.equals("2")){
			strRtn = "탬플릿";
		}else if(objType.equals("3")){
			strRtn = "리포트";
		}else if(objType.equals("8")){
			strRtn = "폴더";
		}else if(objType.equals("10")){
			strRtn = "프롬프트";
		}else if(objType.equals("18")){
			strRtn = "바로가기";	
		}else if(objType.equals("55")){
			if(subType.equals("14081")){
				strRtn = "다큐먼트";
			}else if(subType.equals("14080")){
				strRtn = "HTML다큐먼트";
			}
		}
		
		return strRtn;
	}	
	
	public static String convertObjectTypeSimple(String objType){
		
		String strRtn = "";
		
		/*
    	 *필터   			object_type=1 	subtype= 256
		 *사용자 정의그룹  object_type=1 	subtype= 257
		 *탬플릿     		object_type=2
	     *리포트   		object_type=3
		 *폴더  			object_type=8
		 *프롬프트  		object_type=10
		 *바로가기  		object_type=18
		 *다큐먼트  		object_type=55 	subtype= 14081
		 *HTML다큐먼트 	object_type=55 	subtype= 14080
    	 */
		
		if(objType.equals("1")){
			strRtn = "필터";
		}else if(objType.equals("2")){
			strRtn = "탬플릿";
		}else if(objType.equals("3")){
			strRtn = "리포트";
		}else if(objType.equals("8")){
			strRtn = "폴더";
		}else if(objType.equals("10")){
			strRtn = "프롬프트";
		}else if(objType.equals("18")){
			strRtn = "바로가기";	
		}else if(objType.equals("55")){
			strRtn = "다큐먼트";
		}
		
		return strRtn;
	}
	
	public static String genUUid(String str) { 
        // 
		// Creating a random UUID (Universally unique identifier). 
		// 
		UUID uuid = UUID.randomUUID(); 
		
		String randomUUIDString = uuid.toString(); 
		
		return randomUUIDString;
	} 
	

	
	public static String randomAlpaNum(int num){
		
		Random oRandom 		= new Random();
		String strRandom	= "";
		int index			= 0;
		
		for(int idx=0; idx<=num; idx++ ){
			
			index++;
			
			// 대문자 A-Z 랜덤 알파벳 생성
		    strRandom += (char) ((Math.random() * 26) + 65);
		    if(index == num) {return strRandom;}
		    
		    index++;
		    // 소문자 a-z 랜덤 알파벳 생성
		    strRandom += (char) ((Math.random() * 10) + 97);
		    if(index == num) {return strRandom;}
		    
		    index++;
		    // 숫자만
		    strRandom += String.valueOf(oRandom.nextInt(10) + 1);
		    if(index == num) {return strRandom;}
		}
		
		return strRandom;
	    
	}
	
	
	
	public static String converSucFail(String str){
		 
		String strRtn = "실패";
		
		if(str.equals("0")){
			strRtn = "성공";
		}else if(str.equals("899")){
			strRtn = "테이블명 불일치";
		}
		
		return strRtn;
	}
}
